HAVING句

DBのテーブルは集約したり、グループ化に切り分けたりすることができます

上記記事内で紹介したGROUP BY句はテーブルをグループ化する方法でしたが、そのグループに対して条件を指定したいと思った時には、HAVING句を使用します

HAVING句
SELECT (列名1), (列名2), (列名3),...
FROM  (テーブル名)
GROUP BY  (列名1), (列名2), (列名3),...
HAVING (グループの値に対する条件)

テーブル名:shop

SELECT 類,COUNT(*)
FROM shop
GROUP BY 類
HAVING COUNT(*) = 2;
結果

まずSELECT 類,COUNT(*)で類の数をカウントします 果物2、野菜2、飲み物4

GROUP BY 類で『類』だけを切り取りグループかします

HAVING COUNT(*) = 2;で、COUNTが2のみ指定する と、いう流れになります

集約関数を含む文

HAVING無しの類の列のSUM(合計値)

SELECT 類,SUM(売値)
FROM shop
GROUP BY 類;

HAVING SUM(売値)>500で500以上を指定しての結果

SELECT 類,SUM(売値)
FROM shop
GROUP BY 類 
HAVING SUM(売値)>500

WHERE句を用いて書いても同じ結果を出すことができますが、この二つの差別化として

HAVING句はグループを視野に入れて条件指定

WHERE句は行に対しての条件指定

このように覚えておくといいと思います(・∀・)

結果の並び替え

SELECT文などでデータ全体の結果を表示させた時、もしIDの列を咥えてた場合はIDの小さい順に結果が表示されてました 実はこの並び順はランダムになっていて、次にもう一回呼び出した時に同じような並びになるとは限りません

では、並び順を確実に決めたい場合はどうするかというと...

ORDER BY句

ORDER BY句
SELECT (列名1), (列名2), (列名3),...
FROM  (テーブル名);
ORDER BY (並び替え列名1),(並び替え列名2),...

売値を低い順に並び替える場合

SELECT * FROM shop  
ORDER BY '売値' ASC;

反対に大きい順に並び替えるときは、指定した列名の後にDESCと記述します

ORDER BY句はSELECT文の1番最後に記述してね!

また、このようにORDER BY句ではGROUP BY句でできなかった名前の変更もできます

SELECT * '名前' AS name, '類' AS category
FROM shop
ORDER BY name, category;

なぜかというと、SQL文の処理の順番に秘密があります

FROM→WHERE→GROUP BY→HAVING→SELECT→GROUP BY

大体このように処理されるので、SELECTで適用した内容は、その後に来るGROUP BY句でも適用できる仕組みになっています

GROUP BY句はSELECTよりも前にあるので適用されないことになりますね(・∀・)

集約関数も(COUNT(*)など)も使えます!

複数列の並び替え

先ほど並び替えた⇦のテーブルですが、赤枠内の売値100は仕入れ単価の値も違うので、ここも並び替えたいと思います

SELECT * FROM shop  
ORDER BY '売値 ' '仕入れ単価';

ASCは省略しましたが、ORDER BY句はこのように複数列名を指定することができます

NULLを含む場合

NULLを含む列名にORDER BY句を指定すると

SELECT * FROM shop  
ORDER BY  '仕入れ単価';

結果は1番上か、末尾にまとめられた表示結果になります

おすすめの記事